﻿//======================================================================
//
//        Copyright (C) 苏州逸仙软件    
//        All rights reserved
//
//        filename : CreateValidate.cs
//        description :
//
//        created by 周济 at 2010/12/30 17:07:29
//        mail:80406241@qq.com
//
//======================================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;

namespace huaguwang
{
    public partial class CreateValidate : System.Web.UI.Page
    {
        private string M_SessionName = "";
        private string M_Type = "";
        private string M_Value = "";
        protected void Page_Load(object sender, EventArgs e)
        {
            M_SessionName = Request.Params["name"].Exp_Trim();
            M_Type = Request.Params["stype"].Exp_Trim();
            Response.Buffer = true;
            Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1);
            Response.Expires = 0;
            Response.CacheControl = "no-cache";
            Response.AppendHeader("Pragma", "No-Cache");
            Response.Clear();
            switch(M_Type)
            {
                case "img":
                    CreateImage();
                    break;
                case "code":
                    GetImageCode();
                    break;
                default:
                    break;
            }
            Response.End();
        }
        public void GetImageCode()
        {
            var Code = Session[M_SessionName].Exp_Trim();
            var msg = true.Exp_ExecuteSqlToJson(Code);
            Response.Write(msg);
        }
        public void CreateImage()
        {
            var strs = RndNum(4);
            Session[M_SessionName] = strs;
            CreateImage(strs);
        }
        /// <summary>
        /// 生成随机的字母
        /// </summary>
        /// <param name="VcodeNum">生成字母的个数</param>
        /// <returns>string</returns>
        private string RndNum(int VcodeNum)
        {

            string Vchar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,P,Q,R,S,T,U,W,X,Y,Z";

            string[] VcArray = Vchar.Split(',');

            string VNum = ""; //由于字符串很短，就不用StringBuilder了

            int temp = -1; //记录上次随机数值，尽量避免生产几个一样的随机数

            //采用一个简单的算法以保证生成随机数的不同

            Random rand = new Random();

            for(int i = 1; i < VcodeNum + 1; i++)
            {

                if(temp != -1)
                {

                    rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));

                }

                int t = rand.Next(VcArray.Length);

                if(temp != -1 && temp == t)
                {

                    return RndNum(VcodeNum);

                }

                temp = t;

                VNum += VcArray[t];

            }

            return VNum;

        }




        private void CreateImage(string checkCode)
        {
            int iwidth = (int)(checkCode.Length * 18);
            System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 25);
            Graphics g = Graphics.FromImage(image);
            g.Clear(Color.White);
            //定义颜色
            Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
            //定义字体            
            string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial" };
            Random rand = new Random();
            //随机输出噪点
            for(int i = 0; i < 50; i++)
            {
                int x = rand.Next(image.Width);
                int y = rand.Next(image.Height);
                g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
            }

            //输出不同字体和颜色的验证码字符
            for(int i = 0; i < checkCode.Length; i++)
            {
                int cindex = rand.Next(7);
                int findex = rand.Next(4);

                Font f = new System.Drawing.Font(font[findex], 10, System.Drawing.FontStyle.Bold);
                Brush b = new System.Drawing.SolidBrush(c[cindex]);
                int ii = 4;
                if((i + 1) % 2 == 0)
                {
                    ii = 2;
                }
                g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 12), ii);
            }
            //画一个边框
            g.DrawRectangle(new Pen(Color.White, 0), 0, 0, image.Width - 1, image.Height - 1);

            //输出到浏览器
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            Response.ClearContent();
            Response.ContentType = "image/Jpeg";
            Response.BinaryWrite(ms.ToArray());
            g.Dispose();
            image.Dispose();
        }

    }
}
